package aaa.service;
/*
@Date:2025/6/17
*/

/**
 * 类文档注释
 * 这是一个Spring服务层实现类，负责账户转账业务逻辑
 * 使用JdbcTemplate简化数据库操作
 * 转账方法中包含了两个数据库更新操作和一个模拟异常
 * 该代码演示了事务处理的基本场景，在实际应用中应该添加@Transactional注解确保事务完整性
 * 构造器注入方式保证了依赖不可变，符合Spring推荐的最佳实践
 */

// 导入Spring JDBC核心模块中的JdbcTemplate类，用于简化JDBC操作
import org.springframework.context.annotation.Bean;
import org.springframework.jdbc.core.JdbcTemplate;
// 导入Spring的@Service注解，标识这是一个服务层组件
 import org.springframework.stereotype.Service;

/**
 * 使用@Service注解标记这是一个Spring服务层组件
 * 实现AccountService接口，提供账户相关的业务逻辑实现
 */
@Service
public class AccountServiceImpl implements AccountService{

    // 声明一个final的JdbcTemplate成员变量，用于数据库操作
// final修饰表示这个引用在初始化后不能被修改
    private final JdbcTemplate jdbcTemplate;



    /**
     * 构造方法，通过依赖注入方式接收JdbcTemplate实例
     * @param jdbcTemplate Spring自动注入的JdbcTemplate实例
     */
    public AccountServiceImpl(JdbcTemplate jdbcTemplate) {
// 将注入的JdbcTemplate实例赋值给成员变量
        this.jdbcTemplate = jdbcTemplate;
    }

    /**
     * 实现转账业务逻辑
     * @param fromAccountId 转出账户ID
     * @param toAccountId 转入账户ID
     * @param amount 转账金额
     * @throws RuntimeException 模拟转账过程中可能出现的异常
     */

    public void transfer(String fromAccountId, String toAccountId, Double amount) {
// 1. 执行SQL更新，从转出账户扣除指定金额
// 使用预编译SQL语句防止SQL注入
// 参数1: SQL语句，使用占位符?
// 参数2: 转账金额amount，对应第一个占位符
// 参数3: 转出账户ID，对应第二个占位符
        jdbcTemplate.update("UPDATE account SET balance = balance - ? WHERE id = ?",
                amount, fromAccountId);

// 模拟网络延迟或系统故障导致的异常
// 使用随机数生成50%的概率抛出异常
// 这是为了演示事务处理的需要
        if (Math.random() < 0.5) {
// 抛出运行时异常，模拟转账失败
            throw new RuntimeException("模拟转账失败！");
        }

// 2. 执行SQL更新，向转入账户增加指定金额
// 参数1: SQL语句，使用占位符?
// 参数2: 转账金额amount，对应第一个占位符
// 参数3: 转入账户ID，对应第二个占位符
        jdbcTemplate.update("UPDATE account SET balance = balance + ? WHERE id = ?",
                amount, toAccountId);
    }
}